﻿using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        // 用于存储电话号码及其对应的链接
        private Dictionary<string, HashSet<string>> phoneNumberUrls = new Dictionary<string, HashSet<string>>();
        private static readonly HttpClient client = new HttpClient(); // 创建 HttpClient 实例

        public Form1()
        {
            InitializeComponent(); // 初始化组件
        }

        // 点击按钮时执行的事件
        private async void button1_Click(object sender, EventArgs e)
        {
            // 获取用户输入的关键字
            string keyword = textBox1.Text;
            if (string.IsNullOrWhiteSpace(keyword))
            {
                MessageBox.Show("请输入关键字！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return; // 如果没有输入关键字，则提示并返回
            }

            // 清空列表和字典
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            phoneNumberUrls.Clear();

            try
            {
                // 开始搜索
                await Search(keyword);

                // 显示搜索到的电话号码及其链接
                foreach (var entry in phoneNumberUrls)
                {
                    listBox1.Items.Add($"{entry.Key} : "); // 添加电话号码
                    foreach (var url in entry.Value)
                    {
                        listBox1.Items.Add($"  {url}"); // 添加对应的链接
                    }
                }
            }
            catch (Exception ex)
            {
                // 处理爬取过程中的异常
                MessageBox.Show($"爬取过程中出现错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 根据关键字进行搜索
        private async Task Search(string keyword)
        {
            // 定义搜索引擎的 URL
            string[] searchEngines = {
                "https://www.baidu.com/s?wd=" + keyword,
                "https://www.bing.com/search?q=" + keyword
            };

            List<Task> tasks = new List<Task>(); // 创建任务列表

            // 遍历每个搜索引擎 URL，启动爬取任务
            foreach (var url in searchEngines)
            {
                tasks.Add(Crawl(url));
            }

            await Task.WhenAll(tasks); // 等待所有任务完成
        }

        // 爬取指定 URL 的内容
        private async Task Crawl(string url)
        {
            try
            {
                // 获取页面内容
                string response = await client.GetStringAsync(url);
                var resultLinks = ExtractLinks(response); // 提取搜索结果中的链接
                foreach (var link in resultLinks)
                {
                    await ExtractPhoneNumbers(link); // 提取电话号码
                    listBox2.Items.Add(link); // 记录已爬取的 URL
                }
            }
            catch (HttpRequestException ex)
            {
                // 处理网络请求异常
                MessageBox.Show($"网络请求失败: {ex.Message}");
            }
            catch (Exception ex)
            {
                // 处理其他异常
                MessageBox.Show($"发生错误: {ex.Message}");
            }
        }

        // 从指定 URL 中提取电话号码
        private async Task ExtractPhoneNumbers(string sourceUrl)
        {
            try
            {
                // 获取页面内容
                var response = await client.GetStringAsync(sourceUrl);
                // 正则表达式匹配电话号码
                var regex = new Regex(@"\b1\d{10}\b|\b1\d{3}-\d{4}-\d{4}\b");
                var matches = regex.Matches(response); // 匹配电话号码

                // 遍历所有匹配到的电话号码
                foreach (Match match in matches)
                {
                    string number = match.Value;

                    // 如果字典中不包含此电话号码，则添加
                    if (!phoneNumberUrls.ContainsKey(number))
                    {
                        phoneNumberUrls[number] = new HashSet<string>();
                    }

                    // 将电话号码对应的 URL 添加到字典中
                    phoneNumberUrls[number].Add(sourceUrl);
                }
            }
            catch (HttpRequestException ex)
            {
                // 处理无法访问链接的异常
                MessageBox.Show($"无法访问链接 {sourceUrl}: {ex.Message}");
            }
        }

        // 从 HTML 中提取链接
        private List<string> ExtractLinks(string html)
        {
            var links = new List<string>();
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html); // 加载 HTML 内容
            var nodes = doc.DocumentNode.SelectNodes("//a[@href]"); // 查找所有链接节点
            if (nodes != null)
            {
                foreach (var node in nodes)
                {
                    var href = node.GetAttributeValue("href", string.Empty);
                    // 验证链接的格式，并添加到链接列表中
                    if (Uri.IsWellFormedUriString(href, UriKind.Absolute) &&
                        (href.StartsWith("http://") || href.StartsWith("https://")))
                    {
                        links.Add(href);
                    }
                }
            }
            return links; // 返回提取到的链接列表
        }
    }
}

